Ansible Kickstart

Motivation

Es ist immer schwer einen neuen Blogpost zu beginnen. Am besten waere es immer ueber ein abgeschlossenes Thema zu schreiben, doch in letzter Zeit scheint kein Projekt so richtig fertig zu werden. Das bedeutet weniger Blogposts und immer mehr Chaos in den Projekten.

Vielleicht ist es ein besserer Ansatz einfach ein paar Notizen waehrend dem Arbeiten zu machen. So kann ich an etwas arbeiten und gleichzeitig dokumentieren.

Ansible Kickstart

Seit langer Zeit moechte ich ein System haben, dass mir hilft automatisch ein neues Linux System aufsetzt. Ich habe einen kleinen Server auf dem Proxmox installiert ist und ein bisschen damit herum gespielt. Es ist wahnsinnig produktiv eine neue VM zu starten, ein paar Dinge auszuprobieren und wenn es nicht funktioniert, einfach die VM wieder loeschen. Leider dauert es immer ein bisschen, bis man eine VM auf dem richtigen Stand hat. Dazu habe ich ein paar Ansible Skripte geschrieben, die so Dinge machen wie: User erstellen, ssh Keys kopieren und die essentiellen Pakete installieren.

Leider ist es immernoch ein bisschen komplex und ich wollte ein bisschen aufraeumen und dokumentieren.

Mittels iPXE und preseeding (Ich benutze Debian) setze ich schon ein paar wichtige Einstellungen. Zum Beispiel erstelle ich einen neuen User ansible und setze alle Passwoerter als notsafe.

# Root password, either in clear text
d-i passwd/root-password password notsafe
d-i passwd/root-password-again password notsafe
# or encrypted using a crypt(3)  hash.
#d-i passwd/root-password-crypted password [crypt(3) hash]

# To create a normal user account.
d-i passwd/user-fullname string ansible
d-i passwd/username string ansible
# Normal user's password, either in clear text
d-i passwd/user-password password notsafe
d-i passwd/user-password-again password notsafe

Das sollte auf jeden Fall beim Kickstart neu gesetzt werden.

Dann installiere ich sudo und fuege den Ansible User zur sudo Gruppe hinzu.

# The user account will be added to some standard initial groups. To
# override that, use this.
d-i passwd/user-default-groups string sudo

Natuerlich installiere ich zusaetzlich noch ssh-server. Man sollte natuerlich nicht vergessen keinen Desktop Manager zu installieren.

### Package selection
tasksel tasksel/first multiselect standard, ssh-server

# Individual additional packages to install
#d-i pkgsel/include string openssh-server build-essential
d-i pkgsel/include string sudo

Okay, ist alles was schon da ist. Jetzt zum Ansible Part.

Passwoerter

Als erstes muessen alle Passwoerter geaendert werden. Dazu habe ich ein Playbook geschrieben:

- hosts: all
  tasks:
    - debug: msg="Successfully connected"

    - name: Change the ansible user password
      become: yes
      user:
        name: ansible
        comment: Config Management User
        update_password: always
        password: "{{ ansible_pw | password_hash('sha512') }}"

    - name: Change the root user password
      become: yes
      user:
        name: root
        comment: Config Management User
        update_password: always
        password: "{{ root_pw | password_hash('sha512')}}"

Die Zeilen mit passowrd_hash benutzen einen in Jinja Templates eingebauten Filter und machen aus dem Klartext Passwort einen Hash.

Mit ein paar Optionen kann man das Playbook direkt aufrufen:

ansible-playbook -u ansible -kKi 192.168.17.11, -e "ansible_pw='1234' root_pw='1234'" ansible-password.yml

Die Optionen k und K lassen uns das Passwort fuer den User und fuer sudo setzen.

Damit man die Option spaeter nicht braucht, und auch kein Passwort mehr eingeben muss, muss sudo fuer den User ansible richtig konfiguriert werden.

- name: Configure passwordless sudo for ansible user
  become: yes
  lineinfile:
    state: present
    path: /etc/sudoers
    regexp: '^ansible'
    line: 'ansible ALL=(ALL) NOPASSWD: ALL'
    validate: 'visudo -cf %s'

Und der ssh Schluessel muss auch noch auf den Server kopiert werden:

- name: add the public key for ansible user
  become: yes
  authorized_key:
  args:
    user: ansible
    state: present
    key: "{{ lookup('file', '/home/freddy/.ssh/id_rsa.pub') }}"

Jetzt fehlt nur noch ein Weg, wie man der VM eine statische IP zuweist.